package water.com.util;

import java.util.List;
import java.util.Map;

public interface WaterSQLGenerator<T> {

    /**
     * 根据传入模型自动生成单表全列select SQL语句
     * 例如传入
     * public class User {
     *     private String id;
     *     private String uname;
     *     private String code;
     *     private String password;
     * }
     * 类的对象user,其中String id = 1
     * 则此SQL生成器应当生产SQL语句： select id,uname,code,password from user where id = 1
     * @param model 表模型
     * @return SQL语句
     */
    String selectGenerator(T model) throws IllegalAccessException;

    /**
     * 根据传入模型和字符串列表生产查询指定列的SQL语句
     * 例如传入
     *      public class User {
     *           private String id;
     *           private String uname;
     *           private String code;
     *           private String password;
     *       }
     * 类的对象user,其中String id = 1
     * columns参数传入 code,uname
     * 则此SQL生产器应当生产SQL语句：select code,uname from user where id = 1
     * @param model 表模型
     * @param columns 列字符串
     * @return SQL语句
     */
    String selectGenerator(T model, List<String> columns) throws IllegalAccessException;

    /**
     * 自动生成update语句: update table_name set ..... where ....
     * 其中model中有值的字段将作为更新内容，conditionsMap中的键值对作为更新条件
     * 注意：此sql语句生成方法存在一种情况：无法满足将指定字段置为null的场景
     * 例如传入：
     * public class User {
     *     private String id;
     *     private String uname;
     *     private String code;
     *     private String password;
     * }
     * 类的对象user,其中 uname = 牧之
     * conditionMap中存在  key--id value--1   key--code  value--2
     * 则此SQL生产器应当生成语句： update user set uname = '牧之' where id = 1 and code = 2
     * @param model 表模型
     * @param conditionsMap 更新条件
     * @return 返回SQL语句
     */
    String updateGenerator(T model, Map<String,String> conditionsMap) throws IllegalAccessException;

    /**
     * 自动生成主键条件update语句: update table_name set ..... where internalKey = ...
     * 其中model中有值的字段将作为更新内容，配置主键作为更新条件
     * 注意：此sql语句生成方法存在一种情况：无法满足将指定字段置为null的场景
     * @param model 表模型
     * @return 返回SQL语句
     */
    String updateGenerator(T model) throws IllegalAccessException;

    /**
     * 自动生成update语句: update table_name set ..... where ....
     * 其中model中有值的字段将作为更新内容，conditionsMap中的键值对作为更新条件
     * 支持置空
     * 例如传入
     * public class User {
     *     private String id;
     *     private String uname;
     *     private String code;
     *     private String password;
     * }
     * 类的对象user,其中 id =1 ,uname = null, code = null, password=null
     * conditionMap中： key--id  value -- 1
     * 则会生成语句：update user set id = 1 ,uname = null,code = null,password = null where id = 1
     * @param model 表模型
     * @param conditionsMap 更新条件
     * @return 返回SQL语句
     */
    String updateGeneratorAllowNull(T model, Map<String,String> conditionsMap) throws IllegalAccessException;

    /**
     * 自动生成delete语句
     * 自动根据model中的字段值进行删除数据
     * @param model
     * @return
     */
    String deleteGenerator(T model) throws IllegalAccessException;

    /**
     * 自动生成insert语句
     * @param model
     * @return
     */
    String insertGenerator(T model) throws IllegalAccessException;



}
